package com.huluobo.a2110mvpimdemo.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;

/**
 * Created by LC on 2023/12/23.
 * 网络工具类,可以判断当前是否有网络连接
 * 可以判断弱网环境
 */
public class NetUtils {
    //单例模式核心
    private NetUtils() {
    }

    private static NetUtils netUtils = null;

    private static Context mContext;

    public static NetUtils getInstance(Context context) {
        if (netUtils == null) {
            netUtils = new NetUtils();
        }
        mContext = context;
        return netUtils;
    }

    /**
     * 判断当前是否有网
     *
     * @return true有网, false没网
     */
    public boolean isConnected() {
        //获取网络连接管理器
        ConnectivityManager connectivityManager =
                (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        //拿到当前的网络信息
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        //判断当前是否有网络信息,并且判断当前网络状态是否是已连接或者连接中
        return networkInfo != null && networkInfo.isConnectedOrConnecting();
    }

    /**
     * 判断当前是否处于弱网状态
     *
     * @return true 处于弱网状态 false 非弱网状态
     */
    public boolean isSlowlyNetwork() {
        //获取网络连接管理器
        ConnectivityManager connectivityManager =
                (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取网络流量能力管理器
        NetworkCapabilities networkCapabilities =
                connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
        //判断当前网络是蜂窝网络(2G 3G 4G 5G)
        if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            if (networkCapabilities.getLinkUpstreamBandwidthKbps() > 100
                    && networkCapabilities.getLinkDownstreamBandwidthKbps() > 100) {
                //如果大于100K/s 证明不是一个弱网状态
                return false;
            } else {
                //如果下载上传速度小于100k/s 证明是一个弱网状态
                return true;
            }
        }
        return false;
    }
}
